<?php

/**
 * \file
 * Classe `SearchFormMember`.
 */

namespace pilar\Forms /* \cond */ ; /* \endcond */
{

/**
 * Membre abstrait de formulaire de recherche.
 *
 * \since 10/03/2009
 * \author Dirk MARSKI <dirk.marski@gmail.com>
 */
abstract class SearchFormMember extends \object {


/**
 * Contient les expressions sql des champs.
 *
 * \since 10/03/2009
 */
private $_sqlExpressions = array();


/**
 * Est-ce que les expression sql ont été construit ?
 *
 * \since 10/03/2009
 */
private $_sqlExpressionsCreated = false;


/**
 * Entity member qui est représenté par cette classe.
 *
 * \since 10/03/2009
 */
protected $_entityMember = '';


/**
 * Contient les membres de formulaire.
 *
 * \since 11/03/2009
 */
private $_formMembers = array();


/**
 * Atomes du membre chargés ?
 *
 * \since 12/03/2009
 */
private $_loaded = false;


protected function loadDefaultParams() {
 parent::loadDefaultParams();

 $this->params->define(array(
  'name' => '',
  'label' => '',
  'ignoreInvalid' => true, // Ignorer les champs non valides du formulaire et
                           // les exclure de la requête.
  'hidden' => false // Cacher le champs de recherche ? (Pour l'exploitation des
                    // résultats)
 ));
}


/**
 * Fixe le membre d'entité représenté.
 *
 * \since 10/03/2009
 */
final public function setEntityMember($em) {
 $this->_entityMember = $em;
}


/**
 * Charge les atomes relatifs au membre dans le formulaire.
 *
 * \since 12/03/2009
 */
protected function load() {}


/**
 * On force le chargement des atomes relatifs au membre dans le formulaire.
 *
 * \since 12/03/2009
 */
public function doLoad() {
 if (!$this->_loaded) {
  $this->load();
  $this->_loaded = true;
 }
}


/**
 * Ajoute un membre de formulaire.
 *
 * \param $fm Membre de fomulaire à ajouter.
 * \since 12/03/2009
 */
final public function addFormMember($fm) {
 $this->_formMembers[] = $fm;
}


/**
 * Retourne un membre de formulaire en fonction de son nom.
 *
 * \param $name Nom du membre de formulaire.
 * \return Form member s'il est trouvé, false sinon.
 * \since 16/03/2009
 */
protected function formMember($name) {
 foreach ($this->_formMembers as $fm) {
  if ($fm->get('name') == $name) {
   return $fm;
  }
 }
 return false;
}


/**
 * Retourne les membres de formulaire.
 *
 * \return Membres de formulaire sous forme de tableau.
 * \since 11/03/2009
 */
final public function formMembers() {
 $this->doLoad();
 return $this->_formMembers;
}


/**
 * Retourne le champs demandé du membre d'entité.
 *
 * \param $fn Nom du champ.
 * \return Champ demandé.
 * \since 10/03/2009
 */
final public function entityMemberField($fn = 'value') {
 return $this->_entityMember->field($fn);
}


/**
 * Génère les expressions sql pour les champs non vides et valides du membre.
 *
 * \param $objects ObjectCollection de la requête.
 * \since 11/03/2009
 */
protected function createSqlExpressions($objectsi, $value) {}


/**
 * Vérifie une valeur donnée est acceptable pour un champ donné.
 * Par défault les champs vides sont acceptés, sauf si on indique
 * le contraire grâce au paramètre 'notEmpty'.
 *
 * \param $v Valeur à tester.
 * \param $f Nom du champ.
 * \return \c TRUE si la valeur est acceptable, \c FALSE sinon.
 *
 * \since 10/03/2009
 */
public function acceptsValue($v, $f = 'value') {
 return !$this->get('notEmpty');
}


public function domNode($domDoc) {
 $domSFM = $domDoc->createElement('SearchFormMember');

 foreach ($this->_formMembers as $fm) {
  $domSFM->appendChild($fm->domNode($domDoc));
 }

 return $domSFM;
}


/**
 * Permet d'ajouter une expression sql.
 *
 * \param $exp Expression sql.
 * \since 10/03/2009
 */
final public function addSqlExp($exp) {
 $this->_sqlExpressions[] = $exp;
}


/**
 * Construit et retourne les expression sql des champs du membre.
 *
 * \param $objects ObjectCollection de la requête.
 * \return Tableau contenant les expression sql des champs du membre.
 * \since 10/03/2009
 */
final public function sqlExpressions($objects, $value = '') {
 if (!$this->_sqlExpressionsCreated) {
  $this->createSqlExpressions($objects, $value);
  $this->_sqlExpressionsCreated = true;
 }

 return $this->_sqlExpressions;
}


/**
 * Cache les champs de formulaire.
 *
 * \since 24/03/2009
 */
public function hideFormMembers() {
 foreach ($this->_formMembers as $fm) {
  $fm->set(array('hidden' => true));
 }
}


} // Class.

} // Namespace.

?>
